package com.demo.service.impl;

import com.demo.entity.OpenServerApp;
import com.demo.service.OpenServerAppService;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;

import lombok.extern.slf4j.Slf4j;
import org.apache.commons.codec.binary.Base64;
import org.apache.commons.lang3.ObjectUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
import java.security.InvalidKeyException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.List;
import java.util.Objects;
import java.util.UUID;

import static org.apache.commons.lang.RandomStringUtils.random;

/**
 * @author gy
 */
@Service
@Slf4j
public class OpenServerAppServiceImpl implements OpenServerAppService {

//    @Autowired
//    private OpenServerAppMapper openServerAppMapper;
//    @Autowired
//    private RedisUtils redisUtils;
//
//    @Override
//    public OpenServerApp getServerAppByAppId(String appId) throws JsonProcessingException {
//        String openServerAppRedis = redisUtils.getFromKey(CommonConstant.MATH_AT_OPEN_SERVER_APP_INFO_KEY + appId);
//        ObjectMapper mapper = new ObjectMapper();
//        OpenServerApp openServerApp;
//        if (EmptyHelper.isEmpty(openServerAppRedis)) {
//            QueryWrapper<OpenServerApp> queryWrapper = new QueryWrapper<>();
//            queryWrapper.eq("app_id", appId);
//            openServerApp = openServerAppMapper.selectOne(queryWrapper);
//            if (EmptyHelper.isNotEmpty(openServerApp)) {
//                String treeJson = mapper.writeValueAsString(openServerApp);
//                long num = Objects.requireNonNull(ToolUtils.produceNum(1000, 20000, 1)).get(0).longValue();
//                redisUtils.setForKey(CommonConstant.MATH_AT_OPEN_SERVER_APP_INFO_KEY + appId, treeJson, 432000 + num);
//            }
//        } else {
//            openServerApp = mapper.readValue(openServerAppRedis, OpenServerApp.class);
//        }
//
//        return openServerApp;
//    }
//
//
//    @Override
//    public List<OpenServerApp> getServerAppAll() throws JsonProcessingException {
//        String openServerAppRedis = redisUtils.getFromKey(CommonConstant.MATH_AT_OPEN_SERVER_APP_LIST_KEY);
//        ObjectMapper mapper = new ObjectMapper();
//        List<OpenServerApp> serverAppList;
//        if (EmptyHelper.isEmpty(openServerAppRedis)) {
//            QueryWrapper<OpenServerApp> queryWrapper = new QueryWrapper<>();
//            queryWrapper.eq("status", 1);
//            serverAppList = openServerAppMapper.selectList(queryWrapper);
//            if (EmptyHelper.isNotEmpty(serverAppList)) {
//                String treeJson = mapper.writeValueAsString(serverAppList);
//                long num = Objects.requireNonNull(ToolUtils.produceNum(1000, 20000, 1)).get(0).longValue();
//                redisUtils.setForKey(CommonConstant.MATH_AT_OPEN_SERVER_APP_LIST_KEY, treeJson, 432000 + num);
//            }
//        } else {
//            serverAppList = mapper.readValue(openServerAppRedis,
//                    mapper.getTypeFactory().constructCollectionType(List.class, OpenServerApp.class));
//        }
//        return serverAppList;
//    }
//
//
//    /**
//     * 通过主键id获取 实体
//     *
//     * @param id
//     * @return
//     */
//    @Override
//    public OpenServerApp selectOpenServerAppById(Integer id) {
//        return openServerAppMapper.selectById(id);
//    }
//
//    /**
//     * 查询全部的应用服务列表
//     *
//     * @return
//     */
//    @Override
//    public List<OpenServerApp> selectAllServerApp() {
//        QueryWrapper<OpenServerApp> queryWrapper = new QueryWrapper<>();
//        return openServerAppMapper.selectList(queryWrapper);
//    }
//
//    /**
//     * 创建应用服务
//     *
//     * @param openServerAppParam
//     */
//    @Override
//    public Integer insertOpenServerApp(OpenServerAppParam openServerAppParam) throws NoSuchAlgorithmException {
//
//        OpenServerApp openServerApp = new OpenServerApp();
//        BeanUtils.copyProperties(openServerAppParam, openServerApp);
//
//        // 1.生成app_id
//        String appId = generateAppId();
//        openServerApp.setAppId(appId);
//
//        // 2.生成app_secret
//        String appName = openServerApp.getAppName();
//        String baseInfo = appId + "_" + appName;
//        String appSecret = generateAppSecretUsingHash(baseInfo);
//        openServerApp.setAppSecret(appSecret);
//
//        return openServerAppMapper.insert(openServerApp);
//    }
//
//    /**
//     * 生成appId 采用 uuid 取前16位为全局唯一值
//     *
//     * @return
//     */
//    public static String generateAppId() {
//        UUID uuid = UUID.randomUUID();
//        // 去除UUID字符串表示中的连字符
//        String appId = uuid.toString().replace("-", "");
//        return appId.substring(0, 16);
//    }
//
//    /**
//     * 结合一些特定的信息（如应用名称等）使用哈希函数来生成一个相对短的唯一标识符。
//     * 这里我们使用 SHA-256 哈希函数作为示例。
//     *
//     * @param baseInfo
//     * @return
//     * @throws NoSuchAlgorithmException
//     */
//    public static String generateAppSecretUsingHash(String baseInfo) throws NoSuchAlgorithmException {
//        MessageDigest digest = MessageDigest.getInstance("SHA-256");
//        byte[] hashBytes = digest.digest(baseInfo.getBytes());
//        // 将字节数组转换为十六进制字符串
//        StringBuilder hexString = new StringBuilder();
//        for (byte b : hashBytes) {
//            String hex = Integer.toHexString(0xff & b);
//            if (hex.length() == 1) {
//                hexString.append('0');
//            }
//            hexString.append(hex);
//        }
//        return hexString.substring(0, 32);
//    }
//
//
//    /**
//     * 管理应用服务
//     * 注意：不可修改应用名称 因为与 appSecret关联
//     *
//     * @param openServerAppParam
//     */
//    @Override
//    public Integer updateOpenServerApp(OpenServerAppParam openServerAppParam) {
//        OpenServerApp openServerApp = new OpenServerApp();
//        BeanUtils.copyProperties(openServerAppParam, openServerApp);
//
//        Integer id = openServerAppParam.getId();
//        OpenServerApp openServerAppOriginal = selectOpenServerAppById(id);
//        String appName = openServerAppOriginal.getAppName();
//        // 应用名称不可随意修改
//        if (StringUtils.isNotBlank(openServerAppParam.getAppName()) && !openServerAppParam.getAppName().equals(appName)) {
//            return -1;
//        }
//        // 清除缓存
//        redisUtils.delKey(CommonConstant.MATH_AT_OPEN_SERVER_APP_INFO_KEY + openServerApp.getAppId());
//        return openServerAppMapper.updateById(openServerApp);
//    }
//
//    @Override
//    public Integer delete(Integer id) {
//        return openServerAppMapper.deleteById(id);
//    }
//
//    @Override
//    public String getAccessToken(SelectAccessTokenParam selectAccessTokenParam) throws NoSuchAlgorithmException,
//            UnsupportedEncodingException, InvalidKeyException {
//        String appId = selectAccessTokenParam.getAppId();
//        String appSecret = selectAccessTokenParam.getAppSecret();
//
//        String timestamp = String.valueOf(System.currentTimeMillis() / 1000);
//
//        String str = timestamp + "\n" + appId + "\n" + appSecret + "\n" + random(6);
//        Mac mac = Mac.getInstance("HmacSHA256");
//        mac.init(new SecretKeySpec(appSecret.getBytes(StandardCharsets.UTF_8), "HmacSHA256"));
//        byte[] signData = mac.doFinal(str.getBytes(StandardCharsets.UTF_8));
//        String accessToken = URLEncoder.encode(new String(Base64.encodeBase64(signData)), "UTF-8");
//
//        // 将 accessToken 保存至数据库和缓存中
//        OpenServerApp openServerApp = new OpenServerApp();
//        openServerApp.setAccessToken(accessToken);
//
//        // 保存数据库
//        LambdaUpdateWrapper<OpenServerApp> updateWrapper = new LambdaUpdateWrapper<>();
//        updateWrapper.eq(OpenServerApp::getAppId, appId);
//        openServerAppMapper.update(openServerApp, updateWrapper);
//
//        // 添加到缓存
//        long num = Objects.requireNonNull(ToolUtils.produceNum(1000, 20000, 1)).get(0).longValue();
//        redisUtils.setForKey(CommonConstant.MATH_AT_OPEN_SERVER_APP_INFO_KEY + appId, accessToken, 432000 + num);
//
//        return accessToken;
//    }
//
//    /**
//     * 验证appId是否有效
//     *
//     * @param openServerApp
//     * @return
//     */
//    @Override
//    public boolean appIdIsValid(OpenServerApp openServerApp) {
//        // 应用列表可以查到 同时处于 启用状态
//        return ObjectUtils.isNotEmpty(openServerApp) && openServerApp.getStatus() == 1;
//    }


}
